<script type="module">
	{
		let {a,b} = {
			b : 5,
			a : 100
		};
		document.write(`对象属性 a 的值：${a}<br></br>`);
		document.write(`对象属性 b 的值：${b}<br></br>`);
		
		// 如果变量名与属性名不一致，必须写成下面这样
		// 也就是说，对象的解构赋值的内部机制，是先找到同名属性，然后再赋给对应的变量。真正被赋值的是后者，而不是前者
		let {m:baz} = {m:1,n:2}
		document.write(`真正赋值的是变量baz：${baz}<br></br>`);
		
		let obj = { first: 'hello', last: 'world' };
		let { first: f, last: l } = obj;
		
		document.write(`真正赋值的是变量baz f：${f}<br></br>`);
		document.write(`默真正赋值的是变量baz l：${l}<br></br>`);
		
		// 解构赋值允许，等号左边的模式之中，不放置任何变量名。因此，可以写出非常古怪的赋值表达式
		// 下面的表达式虽然毫无意义，但是语法是合法的，可以执行
		({} = [true, false]);
		({} = 'abc');
		({} = [])
		
		// 对象的解构赋值，可以很方便地将现有对象的方法，赋值到某个变量
		let { random, sin, cos } = Math;
		
		document.write(`将对象的方法赋值给变量 random：${random()}<br></br>`);
		document.write(`将对象的方法赋值给变量 sin：${sin(30)}<br></br>`);
		document.write(`将对象的方法赋值给变量 cos：${cos(40)}<br></br>`);
	}
</script>